package com.xyz.websocketclientdemo.client;

import org.java_websocket.client.WebSocketClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

/**
 * @author Zhang Yu
 * @description: TODO
 * @date 2024/4/24 14:24
 */
@Component
public class WebSocketClientImpl implements IWebSocketClient{

    @Autowired
    private WebSocketClient webSocketClient;

    @Override
    public void groupSending(String message) {

        // 这里我加了6666-- 是因为我在index.html页面中，要拆分用户编号和消息的标识，只是一个例子而已
        // 在index.html会随机生成用户编号，这里相当于模拟页面发送消息
        // 实际这样写就行了 webSocketClient.send(message)
        //字符串
//        webSocketClient.send(message+"---6666");

        //返回信息
        String resultStr = message;
        byte[] resultBytes = toByteArray(resultStr);
        //发送字符串信息的 byte数组
        webSocketClient.send(resultBytes);
    }

    @Override
    public void groupSendingStr(String message) {
        // 这里我加了6666-- 是因为我在index.html页面中，要拆分用户编号和消息的标识，只是一个例子而已
        // 在index.html会随机生成用户编号，这里相当于模拟页面发送消息
        // 实际这样写就行了 webSocketClient.send(message)
        //字符串
        webSocketClient.send(message+"---6666");
    }

    @Override
    public void appointSending(String name, String message) {
        // 这里指定发送的规则由服务端决定参数格式
        webSocketClient.send("TOUSER"+name+";"+message);
    }

    /**
     * byteBuffer 转 byte数组
     * @param buffer
     * @return
     */
    public byte[] bytebuffer2ByteArray(ByteBuffer buffer) {
        //重置 limit 和postion 值
        buffer.flip();
        //获取buffer中有效大小
        int len=buffer.limit() - buffer.position();

        byte [] bytes=new byte[len];

        for (int i = 0; i < bytes.length; i++) {
            bytes[i]=buffer.get();
        }
        return bytes;
    }

    private String ByteBuffer2String(ByteBuffer buffer) {
        Charset charset = Charset.forName("utf-8");
        CharBuffer charBuffer = charset.decode(buffer);
        String s = charBuffer.toString();
        return s;
    }

    public byte[] toByteArray(String hexString) {
        hexString = hexString.toLowerCase();
        final byte[] byteArray = new byte[hexString.length() / 2];
        int k = 0;
        for (int i = 0; i < byteArray.length; i++) {// 因为是16进制，最多只会占用4位，转换成字节需要两个16进制的字符，高位在先
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray[i] = (byte) (high << 4 | low);
            k += 2;
        }
        return byteArray;
    }

}